package com.custom.view

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Typeface
import android.util.AttributeSet
import android.view.View
import android.widget.FrameLayout
import com.custom.util.LogStr
import com.custom.util.dp2px

/**
 * 自定义通讯录右侧列表
 *
 * @author 王永吉
 * @date 2019/7/4 11:23
 */
class MiAddressBook @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
    View(context, attrs, defStyleAttr) {
    //当前手指滑动到的位置
    var choosePosition = -1
    val paint = Paint()
    //右边的所有文字
    var rightTextListStr: String = "↑,※,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,S,Y,Z,#"
    //触发滑动字母监听，让信息滑到指定位置
    private var updateListView: UpdateListView? = null
    //单个文字的高度
    val perTextHeight: Float
    //右侧字体大小
    val textSize: Float

    //触发滑动字母监听
    interface UpdateListView {
        fun updateListView(letter: String)
    }

    init {
        LogStr("init", "45")

        val attributes = context.obtainStyledAttributes(attrs, R.styleable.MiAddressBook)
        //字体大小
        textSize = attributes.getDimension(R.styleable.MiAddressBook_addressTextSize, dp2px(10).toFloat())
        //每个字母的高
        perTextHeight = attributes.getDimension(R.styleable.MiAddressBook_addressPerTextHeight, dp2px(10).toFloat())
        val string = attributes.getString(R.styleable.MiAddressBook_addressRightTextListStr)
        if (string == null || string == "") {
        } else {
            rightTextListStr = string
        }
//        attributes.recycle()

        paint.isAntiAlias = true//抗锯齿
        paint.isDither = true//抗抖动
        paint.textSize = textSize
        paint.typeface = Typeface.DEFAULT//普通字体

        LogStr("init", "66")
    }

    /**
     * 测量view的大小，让其有多大显示多大
     *
     * EXACTLY
     *       精准模式，View需要一个精确值，这个值即为MeasureSpec当中的Size
     *
     * AT_MOST
     *      最大模式，View的尺寸有一个最大值，View不可以超过MeasureSpec当中的Size值
     *
     * UNSPECIFIED
     *      无限制，View对尺寸没有任何限制，View设置为多大就应当为多大一般系统内部使用
     *
     */
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        LogStr("onMeasure", "80")
        val widthMode = MeasureSpec.getMode(widthMeasureSpec)   //获取宽的模式
        val heightMode = MeasureSpec.getMode(heightMeasureSpec) //获取高的模式
        val measureWidth = MeasureSpec.getSize(widthMeasureSpec)   //测量宽度
        val measureHeight = MeasureSpec.getSize(heightMeasureSpec) //测量高度
        var width = 0
        val height: Int

        //        处理宽度
        //如果是精准模式，直接赋值
        if (widthMode == MeasureSpec.EXACTLY) {
            width = measureWidth
        }


        //        处理高度
        //如果是精准模式，直接赋值
        if (heightMode == MeasureSpec.EXACTLY) {
            height = measureHeight
        } else {
            //           非精准模式，高度为  （上下内边距） +（文字高度*（文字长度+1））
            height = (paddingTop + paddingBottom + perTextHeight * (rightTextListStr.split(",").size + 1)).toInt()
        }
        //保存测量宽度和测量高度
        setMeasuredDimension(width, height)
        LogStr("onMeasure", "105")

    }

    //画图
    override fun onDraw(canvas: Canvas) {
        LogStr("onDraw", "111")
        val split = rightTextListStr.split(",")

        for (i in split.indices) {
            paint.color = Color.parseColor("#222222")
            //DisplayUtils.dp2px(getContext(), 3.0f) 这段话的含义是
            // 我为了让字母好点击，手动把字母检索的栏的宽度增加了，
            // 所以画的时候就不可以居中画了，增加了一个偏移量
            canvas.drawText(
                split[i],
                (width - paint.measureText(split[i])) / 2 + dp2px(3),
                (i + 1) * perTextHeight,
                paint
            )
        }
    }

}